package com.yuliang.aicodemother.service;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.yuliang.aicodemother.model.dto.AppQueryRequest;
import com.yuliang.aicodemother.model.entity.App;
import com.yuliang.aicodemother.model.entity.User;
import com.yuliang.aicodemother.model.vo.AppVO;
import jakarta.servlet.http.HttpServletRequest;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用 服务层。
 *
 * @author 程序员鱼亮
 */
public interface AppService extends IService<App> {

    /**
     * 修改应用（仅修改名称）
     *
     * @param id 应用ID
     * @param appName 应用名称
     * @param request HTTP请求
     * @return 是否修改成功
     */
    boolean updateAppName(Long id, String appName, HttpServletRequest request);

    /**
     * 删除应用
     *
     * @param id 应用ID
     * @param request HTTP请求
     * @return 是否删除成功
     */
    boolean deleteApp(Long id, HttpServletRequest request);

    /**
     * 管理员删除任意应用
     *
     * @param id 应用ID
     * @return 是否删除成功
     */
    boolean adminDeleteApp(Long id);

    /**
     * 管理员更新应用
     *
     * @param app 应用信息
     * @return 是否更新成功
     */
    boolean adminUpdateApp(App app);

    /**
     * 获取应用详情
     *
     * @param id 应用ID
     * @param request HTTP请求
     * @return 应用详情
     */
    App getAppById(Long id, HttpServletRequest request);

    /**
     * 管理员获取应用详情
     *
     * @param id 应用ID
     * @return 应用详情
     */
    App adminGetAppById(Long id);

    /**
     * 转换为VO对象
     *
     * @param app 应用实体
     * @return 应用VO
     */
    AppVO getAppVO(App app);

    /**
     * 批量转换为VO对象
     *
     * @param appList 应用实体列表
     * @return 应用VO列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 获取查询条件
     *
     * @param appQueryRequest 查询请求
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    /**
     * AI 生成代码
     *
     * @param appId 应用ID
     * @param message 用户消息
     * @param loginUser 登录用户
     * @return 生成的代码流
     */
    Flux<String> chatToGenCode(Long appId, String message, User loginUser);

    String deployApp(Long appId, User loginUser);
}
